package com.lab.entity;

import lombok.Data;
import java.time.LocalDateTime;

/**
 * 请假申请实体类（映射数据库leave_request表）
 * 用于存储实验室成员的请假申请信息及审批状态，包含每周请假次数限制的相关标识
 */
@Data
public class LeaveRequest {

    /**
     * 主键ID（自增）
     * 对应数据库表字段：id INT NOT NULL AUTO_INCREMENT
     */
    private Integer id;

    /**
     * 请假成员ID（关联成员表）
     * 对应数据库表字段：member_id INT NOT NULL
     * 外键约束：fk_leave_request_member，级联删除（成员删除时同步删除其请假记录）
     */
    private Integer memberId;

    /**
     * 请假理由
     * 对应数据库表字段：reason TEXT NOT NULL
     * 存储成员填写的请假原因详情
     */
    private String reason;

    /**
     * 请假开始时间
     * 对应数据库表字段：start_time DATETIME NOT NULL
     * 标识请假的起始时间点（精确到时分秒）
     */
    private LocalDateTime startTime;

    /**
     * 请假结束时间
     * 对应数据库表字段：end_time DATETIME NOT NULL
     * 标识请假的结束时间点（需晚于startTime）
     */
    private LocalDateTime endTime;

    /**
     * 审批状态
     * 对应数据库表字段：status VARCHAR(20) NOT NULL DEFAULT 'pending'
     * 可选值：pending（待审批）、approved（已批准）、rejected（已拒绝）
     */
    private String status;

    /**
     * 审批人ID（关联用户表）
     * 对应数据库表字段：approve_by INT NULL
     * 外键约束：fk_leave_request_user，删除时设为NULL（审批人账号删除不影响请假记录）
     * 仅当status为approved或rejected时有效
     */
    private Integer approveBy;

    /**
     * 审批时间
     * 对应数据库表字段：approve_time DATETIME NULL
     * 记录审批操作的时间，仅当status为approved或rejected时非空
     */
    private LocalDateTime approveTime;

    /**
     * 周标识（用于每周请假次数限制）
     * 对应数据库表字段：week_identifier VARCHAR(20) NOT NULL
     * 格式：YYYY-WW（如2025-42），用于统计每周请假次数（业务规则：每周最多3次）
     */
    private String weekIdentifier;

    /**
     * 创建时间
     * 对应数据库表字段：create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
     * 请假申请提交的时间，由数据库自动生成
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     * 对应数据库表字段：update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
     * 记录申请信息最后更新的时间（如状态变更时），由数据库自动更新
     */
    private LocalDateTime updateTime;
}